package br.com.pesca.bean;

import br.com.pesca.controller.ArmadilhaController;
import br.com.pesca.controller.EmbarcacaoController;
import br.com.pesca.controller.FormularioController;
import br.com.pesca.controller.HabitatController;
import br.com.pesca.controller.PescadorController;
import br.com.pesca.controller.PetrechoController;
import br.com.pesca.controller.TecnicoController;
import br.com.pesca.dao.PeixeDAO;
import br.com.pesca.dao.PescadorDAO;
import br.com.pesca.dao.TecnicoDAO;
import br.com.pesca.entity.Armadilha;
import br.com.pesca.entity.ArmadilhaAssociativa;
import br.com.pesca.entity.Embarcacao;
import br.com.pesca.entity.Formulario;
import br.com.pesca.entity.Habitat;
import br.com.pesca.entity.Local;
import br.com.pesca.entity.PetrechoAssociativa;
import br.com.pesca.entity.Peixe;
import br.com.pesca.entity.PeixeAssociativa;
import br.com.pesca.entity.Pesca;
import br.com.pesca.entity.Pescador;
import br.com.pesca.entity.Petrecho;
import br.com.pesca.entity.Tecnico;
import java.util.Date;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.inject.Inject;

@SessionScoped
@ManagedBean(name = "formularioBean")
public class FormularioBean extends AbstractBean {

    private Formulario formulario;
    private FormularioController formularioController;
    private Pesca pesca;
    private PeixeAssociativa novoPeixe;
    private PetrechoAssociativa petrechoAssociativa;
    private PetrechoController petrechoController;
    private Pescador pescador;
    private PescadorController pescadorController;
    private Tecnico tecnico;
    private TecnicoController tecnicoController;
    private Local local;
    private Embarcacao embarcacao;
    private EmbarcacaoController embarcacaoController;
    private HabitatController habitatController;
    private ArmadilhaController armadilhaController;
    private ArmadilhaAssociativa armadilhaAssociativa;
    private List<Formulario> formulariosBuscados;
    private String buscaCodigo;
    private Date buscaData;
    private int buscaMes, buscaAno;
    private boolean renderedArmadilhaDescricao;
    private boolean renderedArmadilhaQuantidade;
    private boolean renderedArmadilhaAnzoisPorEspinhel;
    private boolean renderedArmadilhaTamanhoMalha;
    private boolean renderedArmadilhaNumeroAnzol;
    private boolean renderedArmadilhaAltura;
    private boolean renderedArmadilhaComprimento;
    private boolean renderedArmadilhaDiametro;
    private boolean renderedAtributosPetrecho;

    @Inject
    private TecnicoDAO tecnicoDAO;
    @Inject
    private PescadorDAO pescadorDAO;
    @Inject
    private PeixeDAO peixeDAO;

    public FormularioBean() {
        formulario = new Formulario();
    }

    /**
     * Cadastra um novo formulário no sistema.
     *
     * @return String
     */
    public String criarFormulario() {
        FacesContext context = FacesContext.getCurrentInstance();
        try {
            formulario.setCodigo(getFormularioController().getUltimoCodigo() + 1 + "");
            getFormularioController().criaFormulario(formulario);
            closeDialog();
            context.getExternalContext().getFlash().setKeepMessages(true);
            context.addMessage("sucesso", new FacesMessage(FacesMessage.SEVERITY_INFO,
                    "Sucesso!", "Formulário " + formulario.getCodigo() + " foi cadastrado com sucesso!"));
            limpaFormulario();
            return "/pages/protected/admin/index.xhtml";
        } catch (Exception e) {
            keepDialogOpen();
            mensagemAtencao("Formulário não foi cadastrado. Tente novamente mais tarde.");
            e.printStackTrace();
            return null;
        }
    }

    /**
     * Atualiza/edita um formulário previamente cadastrado no sistema.
     *
     * @return String
     */
    public String atualizarFormulario() {
        FacesContext context = FacesContext.getCurrentInstance();
        try {
            getFormularioController().atualizarFormulario(formulario);
            closeDialog();
            context.getExternalContext().getFlash().setKeepMessages(true);
            context.addMessage("sucesso", new FacesMessage(FacesMessage.SEVERITY_INFO,
                    "Sucesso!", "Formulário " + formulario.getCodigo() + " foi editado com sucesso!"));
            limpaFormulario();
            return "/pages/protected/admin/index.xhtml";
        } catch (Exception e) {
            keepDialogOpen();
            mensagemAtencao("Formulário " + formulario.getCodigo() + " não foi editado. Tente novamente mais tarde.");
            e.printStackTrace();
            return null;
        }
    }

    /**
     * Busca formulário previamente cadastrado no sistema pelo seu código.
     *
     */
    public void buscarFormularioPorCodigo() {
        try {
            formulariosBuscados = getFormularioController().buscaCodigo(
                    buscaCodigo);
            if (formulariosBuscados.isEmpty()) {
                mensagemVazia("Nenhum formulário foi encontrado.");
            }
        } catch (Exception e) {
            keepDialogOpen();
            mensagemAtencao("Não foi possível realizar a busca. Tente novamente mais tarde.");
            e.printStackTrace();
        }
    }

    /**
     * Busca formulário previamente cadastrado no sistema pela data em que foi
     * registrado ou por entre um período de datas.
     *
     */
    public void buscarFormularioPorData() {
        try {
            if (buscaData == null) {
                formulariosBuscados = getFormularioController().buscaData(buscaMes, buscaAno);
            } else {
                formulariosBuscados = getFormularioController().buscaData(buscaData);
            }
            if (formulariosBuscados.isEmpty()) {
                mensagemVazia("Nenhum formulário foi encontrado.");
            }
        } catch (Exception e) {
            keepDialogOpen();
            mensagemAtencao("Não foi possível realizar a busca. Tente novamente mais tarde.");
            e.printStackTrace();
        }
    }

    /**
     * Instancia novos objetos e anula as principais variáveis de navegação.
     */
    public void limpaFormulario() {
        formulario = new Formulario();
        pesca = new Pesca();
        pescador = new Pescador();
        tecnico = new Tecnico();
        local = new Local();
        embarcacao = new Embarcacao();
        petrechoAssociativa = new PetrechoAssociativa();
        armadilhaAssociativa = new ArmadilhaAssociativa();
        novoPeixe = new PeixeAssociativa();
        setFormulariosBuscados(null);
        buscaCodigo = "";
        buscaData = null;
        buscaMes = buscaAno = 0;
        setRenderedArmadilhaAltura(false);
        setRenderedArmadilhaAnzoisPorEspinhel(false);
        setRenderedArmadilhaComprimento(false);
        setRenderedArmadilhaDescricao(false);
        setRenderedArmadilhaDiametro(false);
        setRenderedArmadilhaNumeroAnzol(false);
        setRenderedArmadilhaQuantidade(false);
        setRenderedArmadilhaTamanhoMalha(false);
        setRenderedAtributosPetrecho(false);
    }

    /**
     * Método responsável por renderizar os campos de armadilha.
     */
    public void armadilhaChangeListener() {
        if (formulario.getArmadilhaAssociativa().getArmadilha().getTipoArmadilha() != null) {
            formulario.setPetrechoAssociativa(null);
            setRenderedAtributosPetrecho(false);
            setRenderedArmadilhaQuantidade(true);
            formulario.getArmadilhaAssociativa().setQuantidade(0);
            setRenderedArmadilhaAltura(false);
            formulario.getArmadilhaAssociativa().setAltura(0);
            setRenderedArmadilhaAnzoisPorEspinhel(false);
            formulario.getArmadilhaAssociativa().setAnzoisEspinhel(0);
            setRenderedArmadilhaComprimento(false);
            formulario.getArmadilhaAssociativa().setComprimento(0);
            setRenderedArmadilhaDescricao(false);
            formulario.getArmadilhaAssociativa().setDescricao("");
            setRenderedArmadilhaDiametro(false);
            formulario.getArmadilhaAssociativa().setDiamentro(0);
            setRenderedArmadilhaNumeroAnzol(false);
            formulario.getArmadilhaAssociativa().setNumeroAnzol(0);
            setRenderedArmadilhaTamanhoMalha(false);
            formulario.getArmadilhaAssociativa().setTamanhoMalha(0);
            if (formulario.getArmadilhaAssociativa().getArmadilha().getTipoArmadilha().equalsIgnoreCase("Mais de Um")
                    || formulario.getArmadilhaAssociativa().getArmadilha().getTipoArmadilha().equalsIgnoreCase("Outros")) {
                setRenderedArmadilhaDescricao(true);
            } else {
                setRenderedArmadilhaDescricao(false);
                if (formulario.getArmadilhaAssociativa().getArmadilha().getTipoArmadilha().equalsIgnoreCase("Espinhel")
                        || formulario.getArmadilhaAssociativa().getArmadilha().getTipoArmadilha().equalsIgnoreCase("Cambão")) {
                    setRenderedArmadilhaAnzoisPorEspinhel(true);
                    setRenderedArmadilhaNumeroAnzol(true);
                } else {
                    setRenderedArmadilhaAnzoisPorEspinhel(false);
                    setRenderedArmadilhaNumeroAnzol(false);
                    if (formulario.getArmadilhaAssociativa().getArmadilha().getTipoArmadilha().equalsIgnoreCase("Puçá")
                            || formulario.getArmadilhaAssociativa().getArmadilha().getTipoArmadilha().equalsIgnoreCase("Zagaia")) {
                        setRenderedArmadilhaComprimento(true);
                    } else {
                        setRenderedArmadilhaComprimento(false);
                        if (formulario.getArmadilhaAssociativa().getArmadilha().getTipoArmadilha().equalsIgnoreCase("Pari")) {
                            setRenderedArmadilhaAltura(true);
                        } else {
                            setRenderedArmadilhaAltura(false);
                            if (formulario.getArmadilhaAssociativa().getArmadilha().getTipoArmadilha().equalsIgnoreCase("Tarrafa")) {
                                setRenderedArmadilhaTamanhoMalha(true);
                            } else {
                                setRenderedArmadilhaTamanhoMalha(false);
                                if (formulario.getArmadilhaAssociativa().getArmadilha().getTipoArmadilha().equalsIgnoreCase("Caniço")
                                        || formulario.getArmadilhaAssociativa().getArmadilha().getTipoArmadilha().equalsIgnoreCase("Linha de Mão")) {
                                    setRenderedArmadilhaNumeroAnzol(true);
                                    if (formulario.getArmadilhaAssociativa().getArmadilha().getTipoArmadilha().equalsIgnoreCase("Linha de Mão")) {
                                        setRenderedArmadilhaDiametro(true);
                                    } else {
                                        setRenderedArmadilhaDiametro(false);
                                    }
                                } else {
                                    setRenderedArmadilhaNumeroAnzol(false);
                                    setRenderedArmadilhaDiametro(false);
                                }
                            }
                        }
                    }
                }
            }
        } else {
            setRenderedArmadilhaAltura(false);
            setRenderedArmadilhaAnzoisPorEspinhel(false);
            setRenderedArmadilhaComprimento(false);
            setRenderedArmadilhaDescricao(false);
            setRenderedArmadilhaDiametro(false);
            setRenderedArmadilhaNumeroAnzol(false);
            setRenderedArmadilhaQuantidade(false);
            setRenderedArmadilhaTamanhoMalha(false);
        }
    }

    /**
     * Método responsável por renderizar os campos de petrecho.
     */
    public void petrechoChangeListener() {
        if (formulario.getPetrechoAssociativa().getPetrecho() != null) {
            formulario.setArmadilhaAssociativa(null);
            setRenderedAtributosPetrecho(true);
            setRenderedArmadilhaAltura(false);
            setRenderedArmadilhaAnzoisPorEspinhel(false);
            setRenderedArmadilhaComprimento(false);
            setRenderedArmadilhaDescricao(false);
            setRenderedArmadilhaDiametro(false);
            setRenderedArmadilhaNumeroAnzol(false);
            setRenderedArmadilhaQuantidade(false);
            setRenderedArmadilhaTamanhoMalha(false);
        }
    }

    /**
     * Adiciona novos peixes à lista de peixes.
     *
     */
    public void adicionarPeixe() {
        formulario.getPeixeAssociativa().add(novoPeixe);
        novoPeixe = new PeixeAssociativa();
    }

    /**
     * Remove peixes da lista de pesos e comprimentos de peixes.
     *
     * @param p
     */
    public void removePeixe(PeixeAssociativa p) {
        formulario.getPeixeAssociativa().remove(p);
    }

    /**
     * Faz uma busca de técnicos já cadastrados no sistema para o campo de
     * autocompletar.
     *
     * @param query
     * @return
     */
    public List<Tecnico> completeTecnico(String query) {
        return getTecnicoDAO().buscarTecnicoPeloNome(query);
    }

    /**
     * Faz uma busca de peixes já cadastrados no sistema para o campo de
     * autocompletar.
     *
     * @param query
     * @return
     */
    public List<Peixe> completePeixe(String query) {
        return getPeixeDAO().buscarPeixePeloNome(query);
    }

    /**
     * Faz uma busca de pescadores já cadastrados no sistema para o campo de
     * autocompletar.
     *
     * @param query
     * @return
     */
    public List<Pescador> completePescador(String query) {
        return getPescadorDAO().buscarPescadorPeloNome(query);
    }

    /**
     * Busca as embarcações já cadastrados no sistema para preencher uma lista
     * na tela.
     *
     * @return
     */
    public List<Embarcacao> getListaEmbarcacoes() {
        return getEmbarcacaoController().getListaEmbarcacoes();
    }

    /**
     * Busca habitats já cadastrados no sistema para preencher uma lista na
     * tela.
     *
     * @return
     */
    public List<Habitat> getListaHabitat() {
        return getHabitatController().getListaHabitat();
    }

    /**
     * Busca os petrechos já cadastrados no sistema para preencher uma lista na
     * tela.
     *
     * @return
     */
    public List<Petrecho> getListaPetrecho() {
        return getPetrechoController().getListaPetrecho();
    }

    /**
     * Busca as armadilhas já cadastrados no sistema para preencher uma lista na
     * tela.
     *
     * @return
     */
    public List<Armadilha> getListaArmadilhas() {
        return getArmadilhaController().getListaArmadilha();
    }

    /*
     * GETTERS AND SETTERS
     */
    public FormularioController getFormularioController() {
        if (formularioController == null) {
            formularioController = new FormularioController();
        }
        return formularioController;
    }

    public TecnicoDAO getTecnicoDAO() {
        if (tecnicoDAO == null) {
            tecnicoDAO = new TecnicoDAO();
        }
        return tecnicoDAO;
    }

    public PescadorDAO getPescadorDAO() {
        if (pescadorDAO == null) {
            pescadorDAO = new PescadorDAO();
        }
        return pescadorDAO;
    }

    public PeixeDAO getPeixeDAO() {
        if (peixeDAO == null) {
            peixeDAO = new PeixeDAO();
        }
        return peixeDAO;
    }

    public EmbarcacaoController getEmbarcacaoController() {
        if (embarcacaoController == null) {
            embarcacaoController = new EmbarcacaoController();
        }
        return embarcacaoController;
    }

    public HabitatController getHabitatController() {
        if (habitatController == null) {
            habitatController = new HabitatController();
        }
        return habitatController;
    }

    public Formulario getFormulario() {
        return formulario;
    }

    public void setformulario(Formulario formulario) {
        this.formulario = formulario;
    }

    public Pesca getPesca() {
        if (pesca == null) {
            pesca = new Pesca();
        }
        return pesca;
    }

    public PetrechoAssociativa getPetrechoAssociativa() {
        if (petrechoAssociativa == null) {
            petrechoAssociativa = new PetrechoAssociativa();
        }
        return petrechoAssociativa;
    }

    public void setPetrechoAssociativa(PetrechoAssociativa petrechoAssociativa) {
        this.petrechoAssociativa = petrechoAssociativa;
    }

    public PeixeAssociativa getNovoPeixe() {
        if (novoPeixe == null) {
            novoPeixe = new PeixeAssociativa();
        }
        return novoPeixe;
    }

    public void setNovoPeixe(PeixeAssociativa novoPeixe) {
        this.novoPeixe = novoPeixe;
    }

    public PetrechoController getPetrechoController() {
        if (petrechoController == null) {
            petrechoController = new PetrechoController();
        }
        return petrechoController;
    }

    public void setPetrechoController(PetrechoController petrechoController) {
        this.petrechoController = petrechoController;
    }

    public void setPesca(Pesca pesca) {
        this.pesca = pesca;
    }

    public Pescador getPescador() {
        return pescador;
    }

    public void setPescador(Pescador pescador) {
        this.pescador = pescador;
    }

    public PescadorController getPescadorController() {
        return pescadorController;
    }

    public void setPescadorController(PescadorController pescadorController) {
        this.pescadorController = pescadorController;
    }

    public Tecnico getTecnico() {
        return tecnico;
    }

    public void setTecnico(Tecnico tecnico) {
        this.tecnico = tecnico;
    }

    public TecnicoController getTecnicoController() {
        return tecnicoController;
    }

    public void setTecnicoController(TecnicoController tecnicoController) {
        this.tecnicoController = tecnicoController;
    }

    public Local getLocal() {
        if (local == null) {
            local = new Local();
        }
        return local;
    }

    public void setLocal(Local local) {
        this.local = local;
    }

    public String getBuscaCodigo() {
        return buscaCodigo;
    }

    public void setBuscaCodigo(String buscaCodigo) {
        this.buscaCodigo = buscaCodigo;
    }

    public List<Formulario> getFormulariosBuscados() {
        return formulariosBuscados;
    }

    public void setFormulariosBuscados(List<Formulario> formulariosBuscados) {
        this.formulariosBuscados = formulariosBuscados;
    }

    public Date getBuscaData() {
        return buscaData;
    }

    public void setBuscaData(Date buscaData) {
        this.buscaData = buscaData;
    }

    public int getBuscaMes() {
        return buscaMes;
    }

    public void setBuscaMes(int buscaMes) {
        this.buscaMes = buscaMes;
    }

    public int getBuscaAno() {
        return buscaAno;
    }

    public void setBuscaAno(int buscaAno) {
        this.buscaAno = buscaAno;
    }

    public Embarcacao getEmbarcacao() {
        if (embarcacao == null) {
            embarcacao = new Embarcacao();
        }
        return embarcacao;
    }

    public void setEmbarcacao(Embarcacao embarcacao) {
        this.embarcacao = embarcacao;
    }

    public ArmadilhaController getArmadilhaController() {
        if (armadilhaController == null) {
            armadilhaController = new ArmadilhaController();
        }
        return armadilhaController;
    }

    public void setArmadilhaController(ArmadilhaController armadilhaController) {
        this.armadilhaController = armadilhaController;
    }

    public ArmadilhaAssociativa getArmadilhaAssociativa() {
        if (armadilhaAssociativa == null) {
            armadilhaAssociativa = new ArmadilhaAssociativa();
        }
        return armadilhaAssociativa;
    }

    public void setArmadilhaAssociativa(ArmadilhaAssociativa armadilhaAssociativa) {
        this.armadilhaAssociativa = armadilhaAssociativa;
    }

    public boolean isRenderedArmadilhaDescricao() {
        return renderedArmadilhaDescricao;
    }

    public void setRenderedArmadilhaDescricao(boolean renderedArmadilhaDescricao) {
        this.renderedArmadilhaDescricao = renderedArmadilhaDescricao;
    }

    public boolean isRenderedArmadilhaQuantidade() {
        return renderedArmadilhaQuantidade;
    }

    public void setRenderedArmadilhaQuantidade(boolean renderedArmadilhaQuantidade) {
        this.renderedArmadilhaQuantidade = renderedArmadilhaQuantidade;
    }

    public boolean isRenderedArmadilhaAnzoisPorEspinhel() {
        return renderedArmadilhaAnzoisPorEspinhel;
    }

    public void setRenderedArmadilhaAnzoisPorEspinhel(boolean renderedArmadilhaAnzoisPorEspinhel) {
        this.renderedArmadilhaAnzoisPorEspinhel = renderedArmadilhaAnzoisPorEspinhel;
    }

    public boolean isRenderedArmadilhaTamanhoMalha() {
        return renderedArmadilhaTamanhoMalha;
    }

    public void setRenderedArmadilhaTamanhoMalha(boolean renderedArmadilhaTamanhoMalha) {
        this.renderedArmadilhaTamanhoMalha = renderedArmadilhaTamanhoMalha;
    }

    public boolean isRenderedArmadilhaNumeroAnzol() {
        return renderedArmadilhaNumeroAnzol;
    }

    public void setRenderedArmadilhaNumeroAnzol(boolean renderedArmadilhaNumeroAnzol) {
        this.renderedArmadilhaNumeroAnzol = renderedArmadilhaNumeroAnzol;
    }

    public boolean isRenderedArmadilhaAltura() {
        return renderedArmadilhaAltura;
    }

    public void setRenderedArmadilhaAltura(boolean renderedArmadilhaAltura) {
        this.renderedArmadilhaAltura = renderedArmadilhaAltura;
    }

    public boolean isRenderedArmadilhaComprimento() {
        return renderedArmadilhaComprimento;
    }

    public void setRenderedArmadilhaComprimento(boolean renderedArmadilhaComprimento) {
        this.renderedArmadilhaComprimento = renderedArmadilhaComprimento;
    }

    public boolean isRenderedArmadilhaDiametro() {
        return renderedArmadilhaDiametro;
    }

    public void setRenderedArmadilhaDiametro(boolean renderedArmadilhaDiametro) {
        this.renderedArmadilhaDiametro = renderedArmadilhaDiametro;
    }

    public boolean getRenderedAtributosPetrecho() {
        return renderedAtributosPetrecho;
    }

    public void setRenderedAtributosPetrecho(boolean renderedAtributosPetrecho) {
        this.renderedAtributosPetrecho = renderedAtributosPetrecho;
    }
}
